#conding:utf-8
#面向对象分析：  用观察者模式实现---   客户订阅邮局的杂志和报纸，出版社通过客服的信息主动邮寄订阅的杂志和报纸。

#面向对象设计：

#面向对象编程：

# 报社出版商可以提供以下的服务：
# 注册一个报纸订阅者（Register）
# 注销一个报纸订阅者（Remove）
# 通知一个报纸订阅者（Notify）



# 先定义一个Observed类，这个类的作用类似于报纸出版商，他提供注册，注销，通知等功能
class Observed(object): 
	
	#此处初始化一个列表，里面装满了每一个观察者 
	def __init__(self): 
		self.__observers = [] 
	

	#注册一个观察者，注册一个就往列表里添一个，同时更新一下他的数据 
	def registerObservers(self, observer):
		 self.__observers.append(observer) 
		 observer.update(self) 
	
	#注销一个观察者，谁不想看了，直接移走它，以后数据更新了，跟他毛关系都没了 
	def romoveObserver(self, observer): 
		self.__observers.remove(observer) 

	#通知每一个观察者，数据更新了，你们去把数据整理整理在布告牌上发布吧 
	def notifyObservers(self): 
		for observer in self.__observers: 
			observer.update(self)


#定义一个WeatherModel类，这个类继承字Observed类，但是他提供采集数据的功能

#继承了Observed类，这样它具有Observed类的数据及方法 
class WeatherModel(Observed): 
	
	#初始化时，加入一些初始数据 
	def __init__(self, temp, humidity, pressure): 
		super(WeatherModel, self).__init__() 
		self.temp = temp 
		self.humidity = humidity 
		self.pressure = pressure 
	
	#增加一个valueChanged方法，当数据改变时，更新当前数据，然后通知每一个观察者数据变了，要更新了 
	def valueChanged(self, temp, humidity, pressure): 
		if self.temp != temp or self.humidity != humidity or self.pressure != pressure: 
				self.temp = temp 
				self.humidity = humidity 
				self.pressure = pressure 
				self.notifyObservers()


# 定义两个观察者类，CurrentCondition和StatisticCondition

#这个布告板显示实时的气象数据
class CurrentCondition(object): 
	
	def __init__(self): 
		self.currData = [] 
	#每一个观察者都有一个update方法，Observed类里面的notifyObservers方法就是 
	#使用每个观察者各自的update方法更新数据，这个布告板里面的update方法是将三个气象参数打成元组然后 
	#放到初始化的currData列表里 
	def update(self, model): 
		self.currData.append((model.temp, model.humidity, model.pressure)) 
	#这个布告板对气象数据进行统计 
class StaticsCondition(object):
 	
 	#初始化了三个列表，分别存放温度，湿度和压力，这样方便统计最大值，最小值和平均值 
 	def __init__(self): 
 		self.statDataHumidity = [] 
 		self.statDataTemp = [] 
 		self.statDataPressure = [] 
 	
 	#它的update方法是将每个参数放到各自的列表中去 
 	def update(self, model): 
 		self.statDataHumidity.append(model.humidity) 
 		self.statDataTemp.append(model.temp) 
 		self.statDataPressure.append(model.pressure)

		

#搞点数据测试一下
def main(): 
#先创建两个观察者实例 
	current = CurrentCondition() 
	statistic = StaticsCondition() 
#创建一个模型实例，传入一些数 
	model = WeatherModel(20.0, 55.0, 1013.11) 
#把这两个观察注册一下，之后就可以给他们传数据了 
	model.registerObservers(current) 
	model.registerObservers(statistic) 
#整点数据，这里只是随便写写，用于测试 
	model.valueChanged(21.0, 52.3, 1013.12) 
	model.valueChanged(21.2, 53.3, 1013.12) 
	model.valueChanged(22.8, 56.1, 1013.18) 
#输出每个观察的数据列表 
	print(current.currData) 
	print(statistic.statDataTemp) 
	print(statistic.statDataHumidity) 
	print(statistic.statDataPressure)



if __name__ == '__main__':	
	main()
